"""
SimpleOrm 自动发现模型示例

这个示例展示了如何使用 SimpleOrm 的自动发现功能，无需手动指定模型模块路径。
"""

import asyncio
import random
from tortoise.models import Model
from tortoise import fields
from tortoise.exceptions import IntegrityError
from simpleapi import simple_orm


# 定义模型
class User(Model):
    """用户模型"""
    id = fields.IntField(pk=True)
    username = fields.CharField(max_length=50, unique=True)
    email = fields.CharField(max_length=100)
    age = fields.IntField(null=True)
    created_at = fields.DatetimeField(auto_now_add=True)
    
    class Meta:
        table = "users"
        
    def __str__(self):
        return f"User(id={self.id}, username={self.username})"


class Post(Model):
    """文章模型"""
    id = fields.IntField(pk=True)
    title = fields.CharField(max_length=200)
    content = fields.TextField()
    author = fields.ForeignKeyField("models.User", related_name="posts")
    created_at = fields.DatetimeField(auto_now_add=True)
    
    class Meta:
        table = "posts"
        
    def __str__(self):
        return f"Post(id={self.id}, title={self.title})"


async def main():
    """主函数 - 演示自动发现功能"""
    print("SimpleOrm 自动发现模型示例")
    print("=" * 50)
    
    try:
        # 初始化数据库连接 - 不需要指定 models 参数
        # SimpleOrm 会自动发现当前模块中的 User 和 Post 模型
        await simple_orm.init(
            db_url="sqlite://auto_example.db",
            generate_schemas=True
            # 注意：没有指定 models 参数，会自动发现
        )
        
        print("✅ 数据库初始化成功，自动发现了模型")
        
        # 生成随机用户名避免重复
        random_id = random.randint(1000, 9999)
        username = f"auto_user_{random_id}"
        email = f"auto_{random_id}@example.com"
        
        # 创建用户（使用 get_or_create 避免重复）
        user, created = await simple_orm.get_or_create(
            User,
            defaults={"email": email, "age": 30},
            username=username
        )
        
        if created:
            print(f"✅ 创建新用户: {user}")
        else:
            print(f"✅ 获取已存在用户: {user}")
        
        # 创建文章
        post_title = f"自动发现测试文章_{random_id}"
        try:
            post = await simple_orm.create(Post,
                                         title=post_title,
                                         content="这是一篇测试自动发现功能的文章",
                                         author=user)
            print(f"✅ 创建文章: {post}")
        except IntegrityError as e:
            print(f"⚠️ 文章可能已存在: {e}")
            # 尝试获取已存在的文章
            post = await simple_orm.get(Post, title=post_title)
            print(f"✅ 获取已存在文章: {post}")
        
        # 查询数据
        users = await simple_orm.list(User)
        posts = await simple_orm.list(Post)
        
        print(f"✅ 用户总数: {len(users)}")
        print(f"✅ 文章总数: {len(posts)}")
        
        # 使用查询构建器
        adult_users = await (simple_orm.query(User)
                           .filter(age__gte=18)
                           .all())
        print(f"✅ 成年用户数量: {len(adult_users)}")
        
        # 演示更多功能
        print("\n--- 演示其他功能 ---")
        
        # 统计功能
        user_count = await simple_orm.count(User)
        print(f"📊 用户统计: {user_count}")
        
        # 存在性检查
        exists = await simple_orm.exists(User, username=username)
        print(f"🔍 用户 {username} 存在: {exists}")
        
        # 数据序列化
        user_dict = simple_orm.to_dict(user, exclude=["created_at"])
        print(f"📄 用户数据: {user_dict}")
        
        # 查询最新的3个用户
        recent_users = await simple_orm.list(User, limit=3, order_by=["-created_at"])
        print(f"👥 最新用户: {[u.username for u in recent_users]}")
        
        print("\n🎉 自动发现功能测试成功！")
        
    except Exception as e:
        print(f"❌ 错误: {e}")
        import traceback
        traceback.print_exc()
    finally:
        # 关闭数据库连接
        await simple_orm.close()
        print("✅ 数据库连接已关闭")


if __name__ == "__main__":
    asyncio.run(main()) 